From 9a8c209a80b06da44df8e654c068c71523718e85 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Fri, 22 Aug 2008 03:51:56 +0000 Subject: [PATCH] When reconstructing the color hash, try harder to avoid unnecessary * gtk/gtksettings.c: When reconstructing the color hash, try harder to avoid unnecessary notification, since this can lead to infinite reloading of rc files in some situations. svn path=/trunk/; revision=21182 --- ChangeLog | 6 ++++++ gtk/gtksettings.c | 37 ++++++++++++++++++++++++++++++++----- 2 files changed, 38 insertions(+), 5 deletions(-) diff --git a/ChangeLog b/ChangeLog index 2013a35e53..ddbc93adb1 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2008-08-21 Matthias Clasen + + * gtk/gtksettings.c: When reconstructing the color hash, try + harder to avoid unnecessary notification, since this can lead + to infinite reloading of rc files in some situations. + 2008-08-21 Cody Russell * gdk/win32/gdkevents-win32.c (doesnt_want_key): Remove the checks diff --git a/gtk/gtksettings.c b/gtk/gtksettings.c index 32e783944d..1ec5ade207 100644 --- a/gtk/gtksettings.c +++ b/gtk/gtksettings.c @@ -1892,14 +1892,13 @@ _gtk_settings_handle_event (GdkEventSetting *event) if (property_id == PROP_COLOR_SCHEME) { GValue value = { 0, }; - + g_value_init (&value, G_TYPE_STRING); if (!gdk_screen_get_setting (settings->screen, pspec->name, &value)) g_value_set_static_string (&value, ""); merge_color_scheme (settings, &value, GTK_SETTINGS_SOURCE_XSETTING); g_value_unset (&value); } - g_object_notify (G_OBJECT (settings), pspec->name); } } @@ -2258,6 +2257,7 @@ update_color_hash (ColorSchemeData *data, { gboolean changed = FALSE; gint i; + GHashTable *old_hash; if ((str == NULL || *str == '\0') && (data->lastentry[source] == NULL || data->lastentry[source][0] == '\0')) @@ -2291,8 +2291,7 @@ update_color_hash (ColorSchemeData *data, return FALSE; /* Rebuild the merged hash table. */ - if (data->color_hash) - g_hash_table_unref (data->color_hash); + old_hash = data->color_hash; data->color_hash = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, (GDestroyNotify) gdk_color_free); for (i = 0; i <= GTK_SETTINGS_SOURCE_APPLICATION; i++) @@ -2302,7 +2301,35 @@ update_color_hash (ColorSchemeData *data, data->color_hash); } - return TRUE; + if (old_hash) + { + /* now check if the merged hash has changed */ + changed = FALSE; + if (g_hash_table_size (old_hash) != g_hash_table_size (data->color_hash)) + changed = TRUE; + else + { + GHashTableIter iter; + gpointer key, value, new_value; + + g_hash_table_iter_init (&iter, old_hash); + while (g_hash_table_iter_next (&iter, &key, &value)) + { + new_value = g_hash_table_lookup (data->color_hash, key); + if (!new_value || !gdk_color_equal (value, new_value)) + { + changed = TRUE; + break; + } + } + } + + g_hash_table_unref (old_hash); + } + else + changed = TRUE; + + return changed; } static void -- 2.30.2